package com.binhthuan.catechist.client;

import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.Window;
import com.smartgwt.client.widgets.events.ClickEvent;
import com.smartgwt.client.widgets.events.ClickHandler;
import com.smartgwt.client.widgets.layout.HLayout;
import com.smartgwt.client.widgets.layout.VLayout;
import com.smartgwt.client.widgets.toolbar.ToolStrip;
import com.smartgwt.client.widgets.toolbar.ToolStripButton;
import com.smartgwt.client.widgets.toolbar.ToolStripSpacer;

/**
 * @author Giang Đinh - Màn hình chức năng của chương trình, mỗi chức năng là
 *         một màn hình. Để tạo một màn hình chức năng mới thì phải kế thừa lớp
 *         này.
 */
public abstract class AbstractContent extends VLayout {

    private Canvas contentPanel;

    public AbstractContent() {
        super();

        setWidth100();
        setHeight100();

        if (getShowTopBar()) {
            ToolStrip topBar = createTopBar();
            addMember(topBar);
        }

        contentPanel = getContentPanel();
        HLayout wrapper = new HLayout();
        wrapper.setWidth100();
        wrapper.setMembersMargin(10);
        wrapper.addMember(contentPanel);

        addMember(wrapper);
    }

    /**
     * Tạo phần toolbar.
     * 
     * @return
     */
    protected ToolStrip createTopBar() {
        ToolStrip topBar = new ToolStrip();
        topBar.setWidth100();
        topBar.addFill();

        if (getShowPrintButton()) {
            ToolStripButton printerButton = new ToolStripButton();
            printerButton.setTitle(ECApplication.getConstants().print());
            printerButton.setIcon(ECIcons.getIcon24("printer.png"));
            printerButton.setTooltip(ECApplication.getMessages().showPrintPreview());
            printerButton.addClickHandler(new ClickHandler() {

                @Override
                public void onClick(ClickEvent event) {
                    Canvas.showPrintPreview(getPrintPreviewPanel());
                }
            });
            topBar.addButton(printerButton);
        }

        ToolStripButton helpButton = new ToolStripButton();
        helpButton.setTitle(ECApplication.getConstants().help());
        helpButton.setIcon(ECIcons.getIcon24("help.png"));
        helpButton.setTooltip(ECApplication.getMessages().showHelpContent());
        helpButton.addClickHandler(new ClickHandler() {

            @Override
            public void onClick(ClickEvent event) {
                // Hiển thị hộp thoại trợ giúp
                showHelpPanel(getHelpContent(), 640, 600);
            }
        });
        topBar.addButton(helpButton);
        topBar.addSpacer(new ToolStripSpacer(6));
        return topBar;
    }

    /**
     * Hiển thị cửa sổ trợ giúp.
     * 
     * @param content
     *            Nội dung.
     * @param width
     *            Chiều rộng.
     * @param height
     *            Chiều cao.
     */
    protected void showHelpPanel(String content, int width, int height) {
        if (content != null) {
            Window win = new Window();
            win.setTitle(ECApplication.getConstants().help());
            win.setHeaderIcon(ECIcons.getIcon("help.png"), 16, 16);
            win.setShowEdges(true);
            win.setKeepInParentRect(true);

            int userWidth = com.google.gwt.user.client.Window.getClientWidth() - 20;
            win.setWidth(userWidth < width ? userWidth : width);

            int userHeight = com.google.gwt.user.client.Window.getClientHeight() - 96;
            win.setHeight(userHeight < height ? userHeight : height);

            int windowTop = 40;
            int windowLeft = com.google.gwt.user.client.Window.getClientWidth() - (win.getWidth() + 20) - getPageLeft();
            win.setLeft(windowLeft);
            win.setTop(windowTop);
            win.setCanDragReposition(true);
            win.setCanDragResize(true);
            win.setMembersMargin(5);

            String htmlContent = "<p class='intro-para'>" + content + "</p>";
            Canvas wrapper = new Canvas();
            wrapper.setCanSelectText(true);
            wrapper.setPadding(10);
            wrapper.setContents(htmlContent);
            wrapper.setDefaultWidth(200);

            win.setAutoSize(true);
            win.setAutoHeight();
            win.addItem(wrapper);

            addChild(win);
            win.show();
        }
    }

    /**
     * Nội dung của phần trợ giúp của chức năng mà màn hình đang hiển thị.
     * 
     * @return
     */
    protected String getHelpContent() {
        return "help me";
    }

    protected boolean getShowTopBar() {
        return true;
    }

    protected boolean getShowPrintButton() {
        return true;
    }

    protected Canvas getPrintPreviewPanel() {
        return null;
    }

    /**
     * Lấy vùng làm việc của chức năng mà màn hình đang hiển thị.
     * 
     * @return
     */
    public abstract Canvas getContentPanel();
}
